package testy;

import java.util.Random;


public class Heating 
{
    private double area;         //hus stÃ¸rrelse i kvadratmeter
    private int type;                   //oppvarming type
    private double consumption;         //watt per kvadrat meter
    private double heating;      //stroem forbruk i Ã¥r
    private double heatingHour;
    
    private int time;
    private Random rand;
    
    
    private double u_value_Roof;    //varmegjennomgangskoeffisient til tak
    private double u_value_Floor;   //varmegjennomgangskoeffisient til gulv
    private double u_value_Wall;    //varmegjennomgangskoeffisient til yttervegger
    private double u_value_Window;  //varmegjennomgangskoeffisient til vinduer
    
    private double areaRoof;    //tak areal i kvadratt meter
    private double areaFloor;   //gulv areal i kvadratt meter
    private double areaWall;    //yttervegger areal i kvadratt meter 
    private double areaWindow;  //vinduer areal i kvadratt meter
    
    private double wallsHeight; //hÃ¸yde pÃ¥ veggene
    
    private int directive;              //hus forskrift
    private double temperatureIn;       //temp. i huset
    private double temperatureOut;      //temp. ute
    
    private double heatlosesRoof;   //tak varmetap (Watt)
    private double heatlosesFloor;  //gulv varmetap (Watt)
    private double heatlosesWall;   //vegg varmetap (Watt)
    private double heatlosesWindow; //vinduer varmtape (Watt)
    private double heatlosesTotal;  //total varmetap (Watt)

    
    public Heating(double _area, int _type, int startTime)
    {
        area = _area;
        type = _type;
        time = startTime;
    }
    
    /**
     * 
     * @param _area - hus areal
     * @param _type - Oppvarmings type Brukes ikke enda
     * @param _directive - Forskrift: 0 - Byggeforskrift 1949, 1 - Byggeforskrift 1969
     * 2 - Byggeforskrift 1987, 3 - TEK 97, 4 - TEK 07, 5 - TEK 10, 6 - NS 3700 Passiv- og lavenergihus
     * @param _temperatureIn - Temperatur i huset
     * @param _temperatureOut - Temperatur ute
     * @param _wallsHeight - 
     * @param _areaWindow - vinduer areal
     * @param _time - tid
     */
    public Heating(double _area, int _type, int _directive, double _temperatureIn, double _temperatureOut, double _wallsHeight, double _areaWindow, int _time)
    {
        area = _area;
        type = _type;
        directive = _directive;
        temperatureIn = _temperatureIn;
        temperatureOut = _temperatureOut;
        wallsHeight = _wallsHeight;
        areaWindow = _areaWindow;
        time = _time;
    }
    
    /**
     * Demo klass beregner gjennomsnitlig stroem forbruk
     * @return totalConsumption - gjennomsnitt stroem forbruk til oppvarming
     */
    public double Demo()
    {
        consumption = 70;      //gjennomsnitt variabel
        type = 1;               //oppvarming type skal brukes senere
        heating = consumption * area;
        
        
        
        
        return heating;
    }
    
    public void setTime(int _time)
    {
    	time = _time;
    }
    
    public double varians()
        {
            double min, max;
            min = heatingHour * -0.05;
            max = heatingHour * 0.05;
        
       double var = ((min) + (int)(Math.random() * (max - (min) + 1))); 
       return var;
       
    }
    

    /**
    * //TODO
    * Her blir strÃ¸mforbruk fordelt over 24 timer for Ã¥ kunne 
    * simulere for ett dÃ¸gn. 
    * @return 
    */
    
    
    public double dayDemonstration()
    {	Calculation();
    	if (time >= 0 && time <= 5) {
			heatingHour = (heating * 0.01);
                        heatingHour += varians();
		} else if (time >= 6 && time <= 8) {
			heatingHour = (heating * 0.07);
                        heatingHour += varians();
		} else if (time >= 9 && time <= 14) {
			heatingHour = (heating * 0.02);
                        heatingHour += varians();
		} else if (time >= 15 && time <= 17) {
			heatingHour = (heating * 0.06);
                        heatingHour += varians();
		} else if (time >= 18 && time <= 22) {
			heatingHour = (heating * 0.08);
                        heatingHour += varians();
		} else if (time >= 23 && time <= 24) {
			heatingHour = (heating * 0.02);
                        heatingHour += varians();
		}
		return heatingHour;
    }
    
    /**
     * Her skal vi skrive metoder til til mer nÃ¸yaktig beregne
     */


    /**
     * 
     * @return returnere verdien av koeffisienten (varmegjennomgangskoeffisient) avhengig av forskrivning.
     * Ð²Ð¾Ð·Ð²Ñ€Ð°Ñ‰Ð°ÐµÐ¼ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ ÐºÐ¾Ñ�Ñ„Ñ„Ð¸Ñ†Ð¸ÐµÐ½Ñ‚Ð° Ð² Ð·Ð°Ð²Ð¸Ñ�Ð¸Ð¼Ð¾Ñ�Ñ‚Ð¸ Ð¾Ñ‚ Ð¿Ñ€ÐµÐ´Ð¿Ð¸Ñ�Ð°Ð½Ð¸Ñ�
     */
    private void U_Value()
    {
        //Byggeforskrift 1949
        if (directive == 0)
        {
            u_value_Roof = 0.6;
            u_value_Floor = 0.8; 
            u_value_Wall = 1.1;
            u_value_Window = 3.48;
        }
        //Byggeforskrift 1969
        else if (directive == 1)
        {
            u_value_Roof = 0.23;
            u_value_Floor = 0.30; 
            u_value_Wall = 0.45;
            //u_value_Window = 0; //Inkludert i ytterveggberegningen
        }
        //Byggeforskrift 1987
        else if (directive == 2)
        {
            u_value_Roof = 0.20;
            u_value_Floor = 0.30; 
            u_value_Wall = 0.30;
            u_value_Window = 2.4;
        }
        //TEK 97
        else if (directive == 3)
        {
            u_value_Roof = 0.15;
            u_value_Floor = 0.15; 
            u_value_Wall = 0.22;
            u_value_Window = 1.6;
        }
        //TEK 07
        else if (directive == 4)
        {
            u_value_Roof = 0.13;
            u_value_Floor = 0.15; 
            u_value_Wall = 0.18;
            u_value_Window = 1.2;
        }
        //TEK 10
        else if (directive == 5)
        {
            u_value_Roof = 0.13;
            u_value_Floor = 0.15; 
            u_value_Wall = 0.18;
            u_value_Window = 1.2;
        }
        //NS 3700 Passiv- og lavenergihus
        else if (directive == 6)
        {
            u_value_Roof = 0.13;
            u_value_Floor = 0.15; 
            u_value_Wall = 0.15;
            u_value_Window = 0.8;
        }
        
    }//end of U_Value
    
    /**
     * Metode fom beregner arial av tak, gulv, yttervegger og vinduer
     * For enkelhets skyld antar vi at huset har en kvadratisk form
     */
    private void HouseDimension()
    {
        areaRoof = area;
        areaFloor = area;
        areaWindow = areaWindow;    //Skal brukes senere
        areaWall= 4 * Math.sqrt(area) * wallsHeight - areaWindow;
    }//end of HouseDimension
    
    /**
     * Beregning av varmetap omrÃ¥de
     * heatlosesTotal i Watt
     */
    private void heatLossCalculation()
    {
        if(temperatureOut < 0)
                {
        heatlosesRoof = u_value_Roof * (temperatureIn + Math.abs(temperatureOut)) * areaRoof;
        heatlosesFloor = u_value_Floor * (temperatureIn + Math.abs(temperatureOut)) * areaFloor;
        heatlosesWindow = u_value_Window * (temperatureIn + Math.abs(temperatureOut)) * areaWindow;
        heatlosesWall = u_value_Wall * (temperatureIn + Math.abs(temperatureOut)) * areaWall;
        heatlosesTotal = heatlosesRoof + heatlosesFloor + heatlosesWindow + heatlosesWall;
                }
        else
        {
            heatlosesRoof = u_value_Roof * (temperatureIn - temperatureOut) * areaRoof;
        heatlosesFloor = u_value_Floor * (temperatureIn - temperatureOut) * areaFloor;
        heatlosesWindow = u_value_Window * (temperatureIn - temperatureOut) * areaWindow;
        heatlosesWall = u_value_Wall * (temperatureIn - temperatureOut) * areaWall;
        heatlosesTotal = heatlosesRoof + heatlosesFloor + heatlosesWindow + heatlosesWall;
        }
        
    }
    
    /**
     * Metode caller andre nÃ¸dvendige metoder til Ã¥ beregne strÃ¸m forbruk
     * @return heating - gjennomsnitt strÃ¸m forbruk til oppvarming
     */
    public double Calculation()
    {
        U_Value();
        HouseDimension();
        heatLossCalculation();
        heating = heatlosesTotal * 24;    //24 - timer, 365 - dager 
        return heating;
    }
    
    /**
     * Metode caller alle nÃ¸dvendige metoder tilÃ¸ Ã¥ beregne strÃ¸m forbruk per time
     * @return heatingHour
     */
    public double CalculationTime()
    {
        U_Value();
        HouseDimension();
        heatLossCalculation();
        heatingHour = heatlosesTotal;
        return heatingHour;
    }
    
    /**
     * StrÃ¸m som brukes for hus oppvarming i en dag
     * @return 
     */
    public double dayDemoMk2()
    {
	return heatingHour;
    }
    
    
    

}